namespace ConsoleApp1;

public class Lock
{
}

//以下示例定义了一个 Account 类，该类通过锁定专用的 balanceLock 实例来同步对其专用 balance 字段的访问。
//使用同一实例进行锁定可确保两个不同的线程不能同时调用 Debit 或 Credit 方法更新 balance 字段。 此示例使用 C# 13 和新 Lock 对象。 如果使用较旧版本的 C# 或较旧的 .NET 库，请锁定 object 实例。
public class Account
{
    // Use `object` in versions earlier than C# 13
    // private readonly System.Threading.Lock _balanceLock = new();

    private readonly object _balanceLock = new object();
    private decimal _balance;

    public Account(decimal initialBalance) => _balance = initialBalance;

    public decimal Debit(decimal amount)
    {
        if (amount < 0)
        {
            throw new ArgumentOutOfRangeException(nameof(amount), "The debit amount cannot be negative.");
        }

        decimal appliedAmount = 0;
        //与java的synchronized用法类似
        lock (_balanceLock)
        {
            if (_balance >= amount)
            {
                _balance -= amount;
                appliedAmount = amount;
            }
        }

        return appliedAmount;
    }

    public void Credit(decimal amount)
    {
        if (amount < 0)
        {
            throw new ArgumentOutOfRangeException(nameof(amount), "The credit amount cannot be negative.");
        }

        lock (_balanceLock)
        {
            _balance += amount;
        }
    }

    public decimal GetBalance()
    {
        lock (_balanceLock)
        {
            return _balance;
        }
    }
}